package view;

import domain.dto.*;
import domain.vo.*;
import service.*;

public class DeptView {
    /**
     * 显示界⾯
     */
    public static void printError(String message) {
        /* ANSI 转义码，\033[31m表示红⾊，\033[0m表示重置为默认颜⾊ */
       System.out.println("\033[31m" + message + "\033[0m");
    }
   public static DeptVo[] cache;
    public static void printMenu() {
        String menu = """
                ---------------------
                      部⻔管理
                ---------------------
                |    0...返回上级     |
                |    1...部⻔列表     |
                |    2...创建部⻔     |
                |    3...更新部⻔     |
                |    4...删除部⻔     |
                ---------------------
                    请输⼊选项：""";
        System.out.print(menu);
    }
    public static void show() {
        String menuChoice;
        do {
            printMenu();
            menuChoice = MainView.input.nextLine();
            switch (menuChoice) {
                case "0" -> System.out.println("已返回上⼀级菜单");
                case "1" -> list();
                case "2" -> create();
                case "3" -> update();
                case "4" -> delete();
                default -> System.out.println("输⼊⾮法，请输⼊正确的菜单编号！");
            }
        } while (!"0".equals(menuChoice));
    }
    public static void list() {
        // 调⽤服务层获取所有部⻔数据
        Result result = DeptService.list();
        // 将获取到的部⻔数据存⼊缓存
        cache = (DeptVo[]) result.data;
        // 输出表头
        System.out.println("ID\t部⻔名称\t部⻔电话");
        // 遍历缓存中的每个部⻔对象，输出部⻔的ID、名称和电话
        for (DeptVo dept : cache) {
            if (dept != null) {
                // 格式化输出每个部⻔的详细信息
                System.out.printf("%d\t%s\t%s\n", dept.id, dept.name,
                        dept.phone);
            }
        }
    }
    public static void create() {
        // 提示⽤户输⼊部⻔名称
        System.out.print("请输⼊部⻔名称：");
        String name = MainView.input.nextLine(); // 获取⽤户输⼊的部⻔名称
        // 提示⽤户输⼊部⻔电话
        System.out.print("请输⼊部⻔电话：");
        String phone = MainView.input.nextLine(); // 获取⽤户输⼊的部⻔电话
        // 将⽤户输⼊的部⻔名称和电话封装到DeptDto对象中
        DeptDto dto = new DeptDto(name, phone);
        // 调⽤服务层的创建⽅法，创建新的部⻔
        Result result = DeptService.create(dto);
        // 如果创建操作失败，输出错误信息
        if (!result.success) {
            System.err.println(result.message);
            return; // 结束⽅法执⾏
        }
        // 创建成功，输出成功信息
        System.out.println(result.message);
        // 列出当前所有部⻔信息
        list();
    }
    public static void update() {
        DeptVo dept = getCacheById();
        if (dept == null) {
            return;
        }
        // 提示⽤户输⼊部⻔ID
        System.out.print("请输⼊ID，ID必须是⼤于0的整数：");
        // 验证⽤户输⼊的ID是否为整数
        if (!MainView.input.hasNextInt()) {
            MainView.input.nextLine(); // 清除⽆效输⼊
            System.err.println("ID必须为整数，请输⼊整数值");
            return;
        }
        // 获取⽤户输⼊的ID
        int id = MainView.input.nextInt();
        MainView.input.nextLine(); // 清除输⼊缓存中的换⾏符
        // 验证ID是否⼤于0
        if (id < 1) {
            System.err.println("ID必须⼤于0，请重新输⼊");
            return;
        }
        // 如果缓存为空，则从服务层查询所有部⻔信息并缓存
        if (cache == null) {
            Result result = DeptService.list();
            cache = (DeptVo[]) result.data; // 缓存部⻔数据
        }
        // 在缓存中查找指定ID的部⻔
        for (DeptVo item : cache) {
            if (item.id == id) {
                // 找到对应ID的部⻔，输出部⻔信息
                System.out.println("该ID对应的数据是：");
                System.out.printf("ID：%d，名称：%s，电话：%s\n", item.id,
                        item.name, item.phone);
                dept = item;
                break;
            }
        }
        // 如果未找到部⻔，则提示⽤户
        if (dept == null) {
            System.err.println("当前没有该ID对应的数据");
            return;
        }
        // 提示⽤户输⼊新的部⻔名称，按回⻋表示不修改
        System.out.print("请输⼊部⻔名称，直接按回⻋表示不修改：");
        String name = MainView.input.nextLine();
        // 如果⽤户没有输⼊新名称，保持原名称
        name = "".equals(name) ? dept.name : name;
        // 提示⽤户输⼊新的部⻔电话，按回⻋表示不修改
        System.out.print("请输⼊部⻔电话，直接按回⻋表示不修改：");
        String phone = MainView.input.nextLine();
        // 如果⽤户没有输⼊新电话，保持原电话
        phone = "".equals(phone) ? dept.phone : phone;
        // 创建新的 DeptDto 对象，⽤于更新部⻔信息
        DeptDto dto = new DeptDto(name, phone);
        // 调⽤服务层更新部⻔信息
        Result result = DeptService.update(dto, dept.id);
        // 如果更新失败，显示错误信息
        if (!result.success) {
            System.err.println(result.message);
            return;
        }
        // 更新成功，显示成功消息并列出部⻔信息
        System.out.println(result.message);
        list(); // 列出更新后的部⻔列表
    }

    public static void delete() {
        DeptVo dept = getCacheById();
        if (dept == null) {
            return;
        }
        // 提示⽤户输⼊部⻔ID
        System.out.print("请输⼊ID，ID必须是⼤于0的整数：");
        // 验证⽤户输⼊的ID是否为整数
        if (!MainView.input.hasNextInt()) {
            // 清除⽆效输⼊
            MainView.input.nextLine();
            System.err.println("ID必须为整数，请输⼊整数值");
            return;
        }
        // 获取⽤户输⼊的ID
        int id = MainView.input.nextInt();
        // 清除输⼊缓存中的换⾏符
        MainView.input.nextLine();
        // 验证ID是否⼤于0
        if (id < 1) {
            System.err.println("ID必须⼤于0，请重新输⼊");
            return;
        }
        // 如果缓存为空，则从服务层查询所有部⻔信息并缓存
        if (cache == null) {
            // 调⽤服务层获取部⻔列表
            Result result = DeptService.list();
            // 将查询到的部⻔数据缓存
            cache = (DeptVo[]) result.data;
        }
        // 在缓存中查找指定ID的部⻔
        for (DeptVo item : cache) {
            if (item.id == id) {
                // 找到对应ID的部⻔，输出部⻔信息
                System.out.println("该ID对应的数据是：");
                System.out.printf("ID：%d，名称：%s，电话：%s\n", item.id,
                        item.name, item.phone);
                dept = item;
                break;
            }
        }
        // 如果未找到部⻔，则提示⽤户
        if (dept == null) {
            System.err.println("当前没有该ID对应的数据");
            return;
        }
        // 提示⽤户确认是否删除
        System.out.print("输⼊'Y'确认删除，输⼊其它取消删除：");
        String confirm = MainView.input.nextLine();
        // 如果⽤户输⼊的不是'Y'或'y'，则取消删除
        if (!"Y".equalsIgnoreCase(confirm)) {
            System.out.println("您已取消删除");
            return;
        }
        // 调⽤服务层进⾏删除操作
        Result result = DeptService.delete(dept.id);
        // 如果删除操作失败，提示错误信息
        if (!result.success) {
            System.err.println(result.message);
            return;
        }
        // 删除成功，输出成功信息并列出当前部⻔列表
        System.out.println(result.message);
        list();
    }

    public static DeptVo getCacheById() {
        // 提示⽤户输⼊部⻔ID
        System.out.print("请输⼊ID，ID必须是⼤于0的整数：");
        // 验证⽤户输⼊的ID是否为整数
        if (!MainView.input.hasNextInt()) {
            // 清除⽆效输⼊
            MainView.input.nextLine();
            System.err.println("ID必须为整数，请输⼊整数值");
            return null;
        }
        // 获取⽤户输⼊的ID
        int id = MainView.input.nextInt();
        // 清除输⼊缓存中的换⾏符
        MainView.input.nextLine();
        // 验证ID是否⼤于0
        if (id < 1) {
            System.out.println("ID必须⼤于0，请重新输⼊");
            return null;
        }
        // 如果缓存为空，则从服务层查询所有部⻔信息并缓存
        if (cache == null) {
            // 调⽤服务层获取部⻔列表
            Result result = DeptService.list();
            // 将查询到的部⻔数据缓存
            cache = (DeptVo[]) result.data;
        }
        // 在缓存中查找指定ID的部⻔
        DeptVo dept = null;
        for (DeptVo item : cache) {
            if (item.id == id) {
                // 找到对应ID的部⻔，输出部⻔信息
                System.out.println("该ID对应的数据是：");
                System.out.printf("ID：%d，名称：%s，电话：%s\n", item.id,
                        item.name, item.phone);
                dept = item;
                break;
            }
        }
        // 如果未找到部⻔，则提示⽤户
        if (dept == null) {
            System.err.println("当前没有该ID对应的数据");
            return null;
        }
        return dept;
    }
}